###De manera general sin importar las versiones.
data <- read.csv("/Users/jorgevargasmutizabal/Desktop/Frog game statistics/R Analysis Frog/filtered_data.csv")
# Filter the data for Phrase_Condition == 1
filtered_data <- data %>%
filter(Phrase_Condition == 1)
# Hard-code Rounds based on version and level
filtered_data <- filtered_data %>%
mutate(Rounds = case_when(
Game_Version == 1 & Game_Level == 1 ~ 1,
Game_Version == 1 & Game_Level == 3 ~ 2,
Game_Version == 1 & Game_Level == 7 ~ 3,
Game_Version == 1 & Game_Level == 8 ~ 4,
Game_Version == 2 & Game_Level == 5 ~ 1,
Game_Version == 2 & Game_Level == 6 ~ 2,
Game_Version == 2 & Game_Level == 7 ~ 3,
Game_Version == 2 & Game_Level == 8 ~ 4,
Game_Version == 3 & Game_Level == 4 ~ 1,
Game_Version == 3 & Game_Level == 6 ~ 2,
Game_Version == 3 & Game_Level == 7 ~ 3,
Game_Version == 3 & Game_Level == 8 ~ 4,
Game_Version == 4 & Game_Level == 2 ~ 1,
Game_Version == 4 & Game_Level == 3 ~ 2,
Game_Version == 4 & Game_Level == 7 ~ 3,
Game_Version == 4 & Game_Level == 8 ~ 4,
TRUE ~ NA_integer_
))
# Assuming your data frame is named df
summary_table <- filtered_data %>%
group_by(Game_Version, Game_Level, Rounds) %>%
summarise(Count = n(), .groups = 'drop')
print(summary_table)
## # A tibble: 16 × 4
## Game_Version Game_Level Rounds Count
## <int> <int> <dbl> <int>
## 1 1 1 1 418
## 2 1 3 2 214
## 3 1 7 3 108
## 4 1 8 4 107
## 5 2 5 1 468
## 6 2 6 2 268
## 7 2 7 3 108
## 8 2 8 4 118
## 9 3 4 1 476
## 10 3 6 2 238
## 11 3 7 3 129
## 12 3 8 4 132
## 13 4 2 1 474
## 14 4 3 2 425
## 15 4 7 3 118
## 16 4 8 4 142
#total number of conditions instance by level
filtered_data %>%
group_by(Rounds) %>%
summarise(Count = n())
## # A tibble: 4 × 2
## Rounds Count
## <dbl> <int>
## 1 1 1836
## 2 2 1145
## 3 3 463
## 4 4 499
filtered_data <- filtered_data %>%
mutate(
Player_ID = as.factor(Player_ID), # Convert to factor
LexTale = as.numeric(LexTale), # Convert to numeric
Game_Version = as.factor(Game_Version), # Convert to factor
Game_Level = as.numeric(Game_Level), # Convert to factor
Phrase_Condition = as.factor(Phrase_Condition), # Convert to factor
Question_Num = as.numeric(Question_Num), # Convert to numeric
Answer = as.numeric(Answer), # Convert to factor
Reaction_Time = as.numeric(Reaction_Time), # Convert to numeric
Rounds = as.numeric(Rounds) # Convert to numeric
)
# Fit the model with Game_Level as a numeric predictor
model0 <- lmer(Reaction_Time ~ 1 + Rounds + (1 | Player_ID), data = filtered_data)
# Print a summary of the model to examine fixed and random effects
print(summary(model0))
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Reaction_Time ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## REML criterion at convergence: 2219.9
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.4683 -0.6913 -0.1233 0.5382 4.5937
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.01174 0.1083
## Residual 0.09997 0.3162
## Number of obs: 3943, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 5.741e-01 2.050e-02 5.841e+01 28.006 < 2e-16 ***
## Rounds 2.673e-02 4.854e-03 3.906e+03 5.506 3.9e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.451
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model0)
# Additional model diagnostics from the 'performance' package
check_model(model0) # This function will check various model assumptions and fit indices
# Estimate marginal means at specific points along the Rounds
# You would need to know the range or specific points of interest.
# For example, if Game_Level ranges from 1 to 10, you might choose points like 1, 5, and 10.
emm0 <- emmeans(model0, specs = ~ Rounds, at = list(Rounds = c(1, 2,3,4)))
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'pbkrtest.limit = 3943' (or larger)
## [or, globally, 'set emm_options(pbkrtest.limit = 3943)' or larger];
## but be warned that this may result in large computation time and memory use.
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'lmerTest.limit = 3943' (or larger)
## [or, globally, 'set emm_options(lmerTest.limit = 3943)' or larger];
## but be warned that this may result in large computation time and memory use.
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Print the estimated marginal means separately
print(emm0_df)
## Rounds emmean SE df asymp.LCL asymp.UCL
## 1 0.6007954 0.01881627 Inf 0.5639162 0.6376746
## 2 0.6275209 0.01830447 Inf 0.5916448 0.6633970
## 3 0.6542464 0.01905707 Inf 0.6168953 0.6915976
## 4 0.6809720 0.02093818 Inf 0.6399339 0.7220100
##
## Degrees-of-freedom method: asymptotic
## Confidence level used: 0.95
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 0.6007954 0.6275209 0.6542464 0.6809720
# Then, you can plot these points as before:
emm_plot <- ggplot(emm0_df, aes(x = Rounds, y = emmean)) +
geom_point() + # Add points for each estimated marginal mean
geom_line() + # Connect the points with a line to show trends
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) + # Add error bars for confidence intervals
labs(title = "Estimated Marginal Means of Reaction Time by Rounds",
x = "Rounds",
y = "Estimated Marginal Mean Reaction Time") +
theme_minimal() # Use a minimal theme for a clean look
# Print the plot
print(emm_plot)
# Trend analysis for numeric Game_Level
# Assuming trend_analysis is already obtained and contains the trend estimate
# Determine the range of Game_Level you want to visualize
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
# Retrieve the actual coefficient for Rounds from the model
coef_estimate_for_rounds <- coef(summary(model0))['Rounds', 'Estimate']
# Calculate predicted reaction times based on the actual model coefficient
predicted_reaction_times <- coef_estimate_for_rounds * rounds + coef(summary(model0))["(Intercept)", "Estimate"]
# Create a dataframe for plotting
trend_data <- data.frame(Rounds = rounds, Predicted_Reaction_Time = predicted_reaction_times)
# Plotting the trend
trend_plot <- ggplot(trend_data, aes(x = Rounds, y = Predicted_Reaction_Time)) +
geom_line(color = "blue") +
labs(title = "Trend of Reaction Time Across Rounds",
x = "Rounds",
y = "Predicted Reaction Time") +
theme_minimal()
# Print the plot
print(trend_plot)
### Cond 1. Accuracy ### Same thing but for Answer(accuracy) (binomial
variable but logistic regression)
# Fit the model using glmer for a binary response
model0 <- glmer(Answer ~ 1 + Rounds + (1 | Player_ID), data = filtered_data, family = binomial)
# Print a summary of the model to examine fixed and random effects
print(summary(model0))
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Answer ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## AIC BIC logLik deviance df.resid
## 1192.0 1210.8 -593.0 1186.0 3940
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -8.0692 0.1288 0.1533 0.1940 0.4131
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.6636 0.8146
## Number of obs: 3943, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.73674 0.23377 15.985 <2e-16 ***
## Rounds -0.05039 0.07939 -0.635 0.526
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.664
# Simulate residuals using DHARMa
simulationOutput <- simulateResiduals(fittedModel = model0, n = 250)
# Create diagnostic plots
plot(simulationOutput)
plotResiduals(simulationOutput)
plot(simulationOutput, type = "uniform")
plot(simulationOutput, type = "acf")
# Estimate marginal means at specific points along the Rounds
emm1 <- emmeans(model0, specs = ~ Rounds, at = list(Rounds = c(1, 2, 3, 4)), type = "response")
emm1_df <- as.data.frame(summary(emm1))
# Print the estimated marginal means separately
print(emm1_df)
## Rounds prob SE df asymp.LCL asymp.UCL
## 1 0.9755494 0.004545818 Inf 0.9648660 0.9830413
## 2 0.9743181 0.004377016 Inf 0.9641916 0.9816355
## 3 0.9730266 0.005081305 Inf 0.9610633 0.9813854
## 4 0.9716720 0.006570012 Inf 0.9555256 0.9820665
##
## Confidence level used: 0.95
## Intervals are back-transformed from the logit scale
# Extract and print just the mean values
mean_values <- emm1_df$emmean
print(mean_values)
## NULL
# Plot these points
emm_plot1 <- ggplot(emm1_df, aes(x = Rounds, y = prob)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) +
labs(title = "Estimated Marginal Probabilities of Answer = 1 by Rounds",
x = "Rounds",
y = "Probability of Answer = 1") +
theme_minimal()
print(emm_plot1)
# Trend analysis for Rounds
trend_analysis1 <- emtrends(model0, specs = ~ Rounds, var = "Rounds")
# Calculate and plot predicted probabilities across Rounds
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
predicted_probs <- predict(model0, newdata = data.frame(Rounds = rounds), type = "response", re.form = NA)
trend_data1 <- data.frame(Rounds = rounds, Predicted_Probability = predicted_probs)
trend_plot1 <- ggplot(trend_data1, aes(x = Rounds, y = Predicted_Probability)) +
geom_line(color = "blue") +
labs(title = "Trend of Probability of Answer = 1 Across Rounds",
x = "Rounds",
y = "Predicted Probability") +
theme_minimal()
print(trend_plot1)
###Cond 2. Reaction time
data <- read.csv("/Users/jorgevargasmutizabal/Desktop/Frog game statistics/R Analysis Frog/filtered_data.csv")
# Filter the data for Phrase_Condition == 2
filtered_data <- data %>%
filter(Phrase_Condition == 2)
# Hard-code Rounds based on version and level
filtered_data <- filtered_data %>%
mutate(Rounds = case_when(
Game_Version == 1 & Game_Level == 2 ~ 1,
Game_Version == 1 & Game_Level == 3 ~ 2,
Game_Version == 1 & Game_Level == 7 ~ 3,
Game_Version == 1 & Game_Level == 8 ~ 4,
Game_Version == 2 & Game_Level == 1 ~ 1,
Game_Version == 2 & Game_Level == 3 ~ 2,
Game_Version == 2 & Game_Level == 7 ~ 3,
Game_Version == 2 & Game_Level == 8 ~ 4,
Game_Version == 3 & Game_Level == 5 ~ 1,
Game_Version == 3 & Game_Level == 6 ~ 2,
Game_Version == 3 & Game_Level == 7 ~ 3,
Game_Version == 3 & Game_Level == 8 ~ 4,
Game_Version == 4 & Game_Level == 4 ~ 1,
Game_Version == 4 & Game_Level == 6 ~ 2,
Game_Version == 4 & Game_Level == 7 ~ 3,
Game_Version == 4 & Game_Level == 8 ~ 4,
TRUE ~ NA_integer_
))
# Assuming your data frame is named df
summary_table <- filtered_data %>%
group_by(Game_Version, Game_Level, Rounds) %>%
summarise(Count = n(), .groups = 'drop')
print(summary_table)
## # A tibble: 16 × 4
## Game_Version Game_Level Rounds Count
## <int> <int> <dbl> <int>
## 1 1 2 1 423
## 2 1 3 2 214
## 3 1 7 3 107
## 4 1 8 4 106
## 5 2 1 1 409
## 6 2 3 2 277
## 7 2 7 3 106
## 8 2 8 4 113
## 9 3 5 1 472
## 10 3 6 2 237
## 11 3 7 3 128
## 12 3 8 4 128
## 13 4 4 1 551
## 14 4 6 2 283
## 15 4 7 3 116
## 16 4 8 4 143
#total number of conditions instance by level
filtered_data %>%
group_by(Rounds) %>%
summarise(Count = n())
## # A tibble: 4 × 2
## Rounds Count
## <dbl> <int>
## 1 1 1855
## 2 2 1011
## 3 3 457
## 4 4 490
filtered_data <- filtered_data %>%
mutate(
Player_ID = as.factor(Player_ID), # Convert to factor
LexTale = as.numeric(LexTale), # Convert to numeric
Game_Version = as.factor(Game_Version), # Convert to factor
Game_Level = as.numeric(Game_Level), # Convert to factor
Phrase_Condition = as.factor(Phrase_Condition), # Convert to factor
Question_Num = as.numeric(Question_Num), # Convert to numeric
Answer = as.numeric(Answer), # Convert to factor
Reaction_Time = as.numeric(Reaction_Time), # Convert to numeric
Rounds = as.numeric(Rounds) # Convert to numeric
)
#Fitting cond. 2 R.T
# Fit the model with Game_Level as a numeric predictor
model1 <- lmer(Reaction_Time ~ 1 + Rounds + (1 | Player_ID), data = filtered_data)
# Print a summary of the model to examine fixed and random effects
print(summary(model1))
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Reaction_Time ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## REML criterion at convergence: 1754.6
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.9832 -0.6522 -0.1356 0.4777 4.6107
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.02593 0.161
## Residual 0.08939 0.299
## Number of obs: 3813, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 8.076e-01 2.797e-02 4.553e+01 28.876 < 2e-16 ***
## Rounds 2.652e-02 4.613e-03 3.775e+03 5.749 9.66e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.312
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model1)
# Additional model diagnostics from the 'performance' package
check_model(model1) # This function will check various model assumptions and fit indices
# Estimate marginal means at specific points along the Rounds
# You would need to know the range or specific points of interest.
# For example, if Game_Level ranges from 1 to 10, you might choose points like 1, 5, and 10.
emm0 <- emmeans(model1, specs = ~ Rounds, at = list(Rounds = c(1,2,3,4)))
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'pbkrtest.limit = 3813' (or larger)
## [or, globally, 'set emm_options(pbkrtest.limit = 3813)' or larger];
## but be warned that this may result in large computation time and memory use.
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'lmerTest.limit = 3813' (or larger)
## [or, globally, 'set emm_options(lmerTest.limit = 3813)' or larger];
## but be warned that this may result in large computation time and memory use.
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Print the estimated marginal means separately
print(emm0_df)
## Rounds emmean SE df asymp.LCL asymp.UCL
## 1 0.8341458 0.02689057 Inf 0.7814413 0.8868504
## 2 0.8606686 0.02658065 Inf 0.8085715 0.9127657
## 3 0.8871914 0.02706512 Inf 0.8341447 0.9402381
## 4 0.9137142 0.02830321 Inf 0.8582409 0.9691875
##
## Degrees-of-freedom method: asymptotic
## Confidence level used: 0.95
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 0.8341458 0.8606686 0.8871914 0.9137142
# Then, you can plot these points as before:
emm_plot <- ggplot(emm0_df, aes(x = Rounds, y = emmean)) +
geom_point() + # Add points for each estimated marginal mean
geom_line() + # Connect the points with a line to show trends
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) + # Add error bars for confidence intervals
labs(title = "Estimated Marginal Means of Reaction Time by Rounds",
x = "Rounds",
y = "Estimated Marginal Mean Reaction Time") +
theme_minimal() # Use a minimal theme for a clean look
# Print the plot
print(emm_plot)
# Trend analysis for numeric Game_Level
# Assuming trend_analysis is already obtained and contains the trend estimate
# Determine the range of Game_Level you want to visualize
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
# Retrieve the actual coefficient for Rounds from the model
coef_estimate_for_rounds <- coef(summary(model0))['Rounds', 'Estimate']
# Calculate predicted reaction times based on the actual model coefficient
predicted_reaction_times <- coef_estimate_for_rounds * rounds + coef(summary(model1))["(Intercept)", "Estimate"]
# Create a dataframe for plotting
trend_data <- data.frame(Rounds = rounds, Predicted_Reaction_Time = predicted_reaction_times)
# Plotting the trend
trend_plot <- ggplot(trend_data, aes(x = Rounds, y = Predicted_Reaction_Time)) +
geom_line(color = "blue") +
labs(title = "Trend of Reaction Time Across Rounds",
x = "Rounds",
y = "Predicted Reaction Time") +
theme_minimal()
# Print the plot
print(trend_plot)
###Accuracy cond. 2
# Fit the model using glmer for a binary response
model1 <- glmer(Answer ~ 1 + Rounds + (1 | Player_ID), data = filtered_data, family = binomial)
# Print a summary of the model to examine fixed and random effects
print(summary(model1))
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Answer ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## AIC BIC logLik deviance df.resid
## 2141.3 2160.1 -1067.7 2135.3 3810
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -5.5396 0.2203 0.2640 0.3265 0.6564
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.3825 0.6184
## Number of obs: 3813, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.62148 0.16146 16.236 <2e-16 ***
## Rounds -0.02509 0.05540 -0.453 0.651
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.658
# Simulate residuals using DHARMa
simulationOutput <- simulateResiduals(fittedModel = model1, n = 250)
# Create diagnostic plots
plot(simulationOutput)
plotResiduals(simulationOutput)
plot(simulationOutput, type = "uniform")
plot(simulationOutput, type = "acf")
# Estimate marginal means at specific points along the Rounds
emm1 <- emmeans(model1, specs = ~ Rounds, at = list(Rounds = c(1, 2, 3, 4)), type = "response")
emm1_df <- as.data.frame(summary(emm1))
# Print the estimated marginal means separately
print(emm1_df)
## Rounds prob SE df asymp.LCL asymp.UCL
## 1 0.9306285 0.008508908 Inf 0.9119805 0.9455615
## 2 0.9289909 0.008028419 Inf 0.9115537 0.9432045
## 3 0.9273176 0.009139958 Inf 0.9072415 0.9433200
## 4 0.9256081 0.011543631 Inf 0.8995764 0.9453022
##
## Confidence level used: 0.95
## Intervals are back-transformed from the logit scale
# Extract and print just the mean values
mean_values <- emm1_df$emmean
print(mean_values)
## NULL
# Plot these points
emm_plot1 <- ggplot(emm1_df, aes(x = Rounds, y = prob)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) +
labs(title = "Estimated Marginal Probabilities of Answer = 1 by Rounds",
x = "Rounds",
y = "Probability of Answer = 1") +
theme_minimal()
print(emm_plot1)
# Trend analysis for Rounds
trend_analysis1 <- emtrends(model1, specs = ~ Rounds, var = "Rounds")
# Calculate and plot predicted probabilities across Rounds
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
predicted_probs <- predict(model1, newdata = data.frame(Rounds = rounds), type = "response", re.form = NA)
trend_data1 <- data.frame(Rounds = rounds, Predicted_Probability = predicted_probs)
trend_plot1 <- ggplot(trend_data1, aes(x = Rounds, y = Predicted_Probability)) +
geom_line(color = "blue") +
labs(title = "Trend of Probability of Answer = 1 Across Rounds",
x = "Rounds",
y = "Predicted Probability") +
theme_minimal()
print(trend_plot1)
data <- read.csv("/Users/jorgevargasmutizabal/Desktop/Frog game statistics/R Analysis Frog/filtered_data.csv")
# Filter the data for Phrase_Condition == 3
filtered_data <- data %>%
filter(Phrase_Condition == 3)
# Hard-code Rounds based on version and level
filtered_data <- filtered_data %>%
mutate(Rounds = case_when(
Game_Version == 1 & Game_Level == 4 ~ 1,
Game_Version == 1 & Game_Level == 6 ~ 2,
Game_Version == 1 & Game_Level == 7 ~ 3,
Game_Version == 1 & Game_Level == 8 ~ 4,
Game_Version == 2 & Game_Level == 2 ~ 1,
Game_Version == 2 & Game_Level == 3 ~ 2,
Game_Version == 2 & Game_Level == 7 ~ 3,
Game_Version == 2 & Game_Level == 8 ~ 4,
Game_Version == 3 & Game_Level == 1 ~ 1,
Game_Version == 3 & Game_Level == 3 ~ 2,
Game_Version == 3 & Game_Level == 7 ~ 3,
Game_Version == 3 & Game_Level == 8 ~ 4,
Game_Version == 4 & Game_Level == 5 ~ 1,
Game_Version == 4 & Game_Level == 6 ~ 2,
Game_Version == 4 & Game_Level == 7 ~ 3,
Game_Version == 4 & Game_Level == 8 ~ 4,
TRUE ~ NA_integer_
))
# Assuming your data frame is named df
summary_table <- filtered_data %>%
group_by(Game_Version, Game_Level, Rounds) %>%
summarise(Count = n(), .groups = 'drop')
print(summary_table)
## # A tibble: 16 × 4
## Game_Version Game_Level Rounds Count
## <int> <int> <dbl> <int>
## 1 1 4 1 473
## 2 1 6 2 237
## 3 1 7 3 108
## 4 1 8 4 108
## 5 2 2 1 479
## 6 2 3 2 280
## 7 2 7 3 105
## 8 2 8 4 119
## 9 3 1 1 554
## 10 3 3 2 347
## 11 3 7 3 129
## 12 3 8 4 131
## 13 4 5 1 677
## 14 4 6 2 284
## 15 4 7 3 120
## 16 4 8 4 143
#total number of conditions instance by level
filtered_data %>%
group_by(Rounds) %>%
summarise(Count = n())
## # A tibble: 4 × 2
## Rounds Count
## <dbl> <int>
## 1 1 2183
## 2 2 1148
## 3 3 462
## 4 4 501
filtered_data <- filtered_data %>%
mutate(
Player_ID = as.factor(Player_ID), # Convert to factor
LexTale = as.numeric(LexTale), # Convert to numeric
Game_Version = as.factor(Game_Version), # Convert to factor
Game_Level = as.numeric(Game_Level), # Convert to factor
Phrase_Condition = as.factor(Phrase_Condition), # Convert to factor
Question_Num = as.numeric(Question_Num), # Convert to numeric
Answer = as.numeric(Answer), # Convert to factor
Reaction_Time = as.numeric(Reaction_Time), # Convert to numeric
Rounds = as.numeric(Rounds) # Convert to numeric
)
##fitting cond. 3
# Fit the model with Game_Level as a numeric predictor
model2 <- lmer(Reaction_Time ~ 1 + Rounds + (1 | Player_ID), data = filtered_data)
# Print a summary of the model to examine fixed and random effects
print(summary(model2))
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Reaction_Time ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## REML criterion at convergence: 4014.3
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.3998 -0.7194 -0.1690 0.5611 3.6936
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.01774 0.1332
## Residual 0.14523 0.3811
## Number of obs: 4294, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 5.988e-01 2.485e-02 5.593e+01 24.098 < 2e-16 ***
## Rounds 3.239e-02 5.751e-03 4.266e+03 5.633 1.88e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.431
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model2)
# Additional model diagnostics from the 'performance' package
check_model(model2) # This function will check various model assumptions and fit indices
# Estimate marginal means at specific points along the Rounds
# You would need to know the range or specific points of interest.
# For example, if Game_Level ranges from 1 to 10, you might choose points like 1, 5, and 10.
emm0 <- emmeans(model2, specs = ~ Rounds, at = list(Rounds = c(1, 2,3,4)))
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'pbkrtest.limit = 4294' (or larger)
## [or, globally, 'set emm_options(pbkrtest.limit = 4294)' or larger];
## but be warned that this may result in large computation time and memory use.
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'lmerTest.limit = 4294' (or larger)
## [or, globally, 'set emm_options(lmerTest.limit = 4294)' or larger];
## but be warned that this may result in large computation time and memory use.
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Print the estimated marginal means separately
print(emm0_df)
## Rounds emmean SE df asymp.LCL asymp.UCL
## 1 0.6312074 0.02296639 Inf 0.5861941 0.6762207
## 2 0.6636013 0.02243997 Inf 0.6196197 0.7075828
## 3 0.6959951 0.02336210 Inf 0.6502062 0.7417840
## 4 0.7283890 0.02557658 Inf 0.6782598 0.7785181
##
## Degrees-of-freedom method: asymptotic
## Confidence level used: 0.95
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 0.6312074 0.6636013 0.6959951 0.7283890
# Then, you can plot these points as before:
emm_plot <- ggplot(emm0_df, aes(x = Rounds, y = emmean)) +
geom_point() + # Add points for each estimated marginal mean
geom_line() + # Connect the points with a line to show trends
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) + # Add error bars for confidence intervals
labs(title = "Estimated Marginal Means of Reaction Time by Rounds",
x = "Rounds",
y = "Estimated Marginal Mean Reaction Time") +
theme_minimal() # Use a minimal theme for a clean look
# Print the plot
print(emm_plot)
# Trend analysis for numeric Game_Level
# Assuming trend_analysis is already obtained and contains the trend estimate
# Determine the range of Game_Level you want to visualize
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
# Retrieve the actual coefficient for Rounds from the model
coef_estimate_for_rounds <- coef(summary(model2))['Rounds', 'Estimate']
# Calculate predicted reaction times based on the actual model coefficient
predicted_reaction_times <- coef_estimate_for_rounds * rounds + coef(summary(model0))["(Intercept)", "Estimate"]
# Create a dataframe for plotting
trend_data <- data.frame(Rounds = rounds, Predicted_Reaction_Time = predicted_reaction_times)
# Plotting the trend
trend_plot <- ggplot(trend_data, aes(x = Rounds, y = Predicted_Reaction_Time)) +
geom_line(color = "blue") +
labs(title = "Trend of Reaction Time Across Rounds",
x = "Rounds",
y = "Predicted Reaction Time") +
theme_minimal()
# Print the plot
print(trend_plot)
#Cond. 3 Accuracy
# Fit the model using glmer for a binary response
model2 <- glmer(Answer ~ 1 + Rounds + (1 | Player_ID), data = filtered_data, family = binomial)
# Print a summary of the model to examine fixed and random effects
print(summary(model1))
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Answer ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## AIC BIC logLik deviance df.resid
## 2141.3 2160.1 -1067.7 2135.3 3810
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -5.5396 0.2203 0.2640 0.3265 0.6564
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.3825 0.6184
## Number of obs: 3813, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.62148 0.16146 16.236 <2e-16 ***
## Rounds -0.02509 0.05540 -0.453 0.651
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.658
# Simulate residuals using DHARMa
simulationOutput <- simulateResiduals(fittedModel = model2, n = 250)
# Create diagnostic plots
plot(simulationOutput)
plotResiduals(simulationOutput)
plot(simulationOutput, type = "uniform")
plot(simulationOutput, type = "acf")
# Estimate marginal means at specific points along the Rounds
emm1 <- emmeans(model2, specs = ~ Rounds, at = list(Rounds = c(1, 2, 3, 4)), type = "response")
emm1_df <- as.data.frame(summary(emm1))
# Print the estimated marginal means separately
print(emm1_df)
## Rounds prob SE df asymp.LCL asymp.UCL
## 1 0.9501689 0.009392834 Inf 0.9281882 0.9656705
## 2 0.9543505 0.008403113 Inf 0.9347463 0.9682649
## 3 0.9581966 0.008244276 Inf 0.9386977 0.9716804
## 4 0.9617316 0.008617639 Inf 0.9407653 0.9754703
##
## Confidence level used: 0.95
## Intervals are back-transformed from the logit scale
# Extract and print just the mean values
mean_values <- emm1_df$emmean
print(mean_values)
## NULL
# Plot these points
emm_plot1 <- ggplot(emm1_df, aes(x = Rounds, y = prob)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) +
labs(title = "Estimated Marginal Probabilities of Answer = 1 by Rounds",
x = "Rounds",
y = "Probability of Answer = 1") +
theme_minimal()
print(emm_plot1)
# Trend analysis for Rounds
trend_analysis1 <- emtrends(model2, specs = ~ Rounds, var = "Rounds")
# Calculate and plot predicted probabilities across Rounds
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
predicted_probs <- predict(model1, newdata = data.frame(Rounds = rounds), type = "response", re.form = NA)
trend_data1 <- data.frame(Rounds = rounds, Predicted_Probability = predicted_probs)
trend_plot1 <- ggplot(trend_data1, aes(x = Rounds, y = Predicted_Probability)) +
geom_line(color = "blue") +
labs(title = "Trend of Probability of Answer = 1 Across Rounds",
x = "Rounds",
y = "Predicted Probability") +
theme_minimal()
print(trend_plot1)
data <- read.csv("/Users/jorgevargasmutizabal/Desktop/Frog game statistics/R Analysis Frog/filtered_data.csv")
# Filter the data for Phrase_Condition == 4
filtered_data <- data %>%
filter(Phrase_Condition == 4)
# Hard-code Rounds based on version and level
filtered_data <- filtered_data %>%
mutate(Rounds = case_when(
Game_Version == 1 & Game_Level == 5 ~ 1,
Game_Version == 1 & Game_Level == 6 ~ 2,
Game_Version == 1 & Game_Level == 7 ~ 3,
Game_Version == 1 & Game_Level == 8 ~ 4,
Game_Version == 2 & Game_Level == 4 ~ 1,
Game_Version == 2 & Game_Level == 6 ~ 2,
Game_Version == 2 & Game_Level == 7 ~ 3,
Game_Version == 2 & Game_Level == 8 ~ 4,
Game_Version == 3 & Game_Level == 2 ~ 1,
Game_Version == 3 & Game_Level == 3 ~ 2,
Game_Version == 3 & Game_Level == 7 ~ 3,
Game_Version == 3 & Game_Level == 8 ~ 4,
Game_Version == 4 & Game_Level == 1 ~ 1,
Game_Version == 4 & Game_Level == 3 ~ 2,
Game_Version == 4 & Game_Level == 7 ~ 3,
Game_Version == 4 & Game_Level == 8 ~ 4,
TRUE ~ NA_integer_
))
# Assuming your data frame is named df
summary_table <- filtered_data %>%
group_by(Game_Version, Game_Level, Rounds) %>%
summarise(Count = n(), .groups = 'drop')
print(summary_table)
## # A tibble: 16 × 4
## Game_Version Game_Level Rounds Count
## <int> <int> <dbl> <int>
## 1 1 5 1 1298
## 2 1 6 2 228
## 3 1 7 3 107
## 4 1 8 4 106
## 5 2 4 1 1262
## 6 2 6 2 249
## 7 2 7 3 99
## 8 2 8 4 114
## 9 3 2 1 2133
## 10 3 3 2 335
## 11 3 7 3 124
## 12 3 8 4 120
## 13 4 1 1 2589
## 14 4 3 2 410
## 15 4 7 3 117
## 16 4 8 4 147
#total number of conditions instance by level
filtered_data %>%
group_by(Rounds) %>%
summarise(Count = n())
## # A tibble: 4 × 2
## Rounds Count
## <dbl> <int>
## 1 1 7282
## 2 2 1222
## 3 3 447
## 4 4 487
filtered_data <- filtered_data %>%
mutate(
Player_ID = as.factor(Player_ID), # Convert to factor
LexTale = as.numeric(LexTale), # Convert to numeric
Game_Version = as.factor(Game_Version), # Convert to factor
Game_Level = as.numeric(Game_Level), # Convert to factor
Phrase_Condition = as.factor(Phrase_Condition), # Convert to factor
Question_Num = as.numeric(Question_Num), # Convert to numeric
Answer = as.numeric(Answer), # Convert to factor
Reaction_Time = as.numeric(Reaction_Time), # Convert to numeric
Rounds = as.numeric(Rounds) # Convert to numeric
)
# Fit the model with Game_Level as a numeric predictor
model3 <- lmer(Reaction_Time ~ 1 + Rounds + (1 | Player_ID), data = filtered_data)
# Print a summary of the model to examine fixed and random effects
print(summary(model3))
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Reaction_Time ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## REML criterion at convergence: 9050.5
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.9966 -0.7114 -0.0899 0.6491 3.3479
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.03542 0.1882
## Residual 0.15013 0.3875
## Number of obs: 9438, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 1.016e+00 3.169e-02 4.136e+01 32.063 <2e-16 ***
## Rounds 4.273e-03 5.075e-03 9.409e+03 0.842 0.4
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.230
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model3)
# Additional model diagnostics from the 'performance' package
check_model(model3) # This function will check various model assumptions and fit indices
# Estimate marginal means at specific points along the Rounds
# You would need to know the range or specific points of interest.
# For example, if Game_Level ranges from 1 to 10, you might choose points like 1, 5, and 10.
emm0 <- emmeans(model3, specs = ~ Rounds, at = list(Rounds = c(1, 2,3,4)))
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'pbkrtest.limit = 9438' (or larger)
## [or, globally, 'set emm_options(pbkrtest.limit = 9438)' or larger];
## but be warned that this may result in large computation time and memory use.
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'lmerTest.limit = 9438' (or larger)
## [or, globally, 'set emm_options(lmerTest.limit = 9438)' or larger];
## but be warned that this may result in large computation time and memory use.
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Print the estimated marginal means separately
print(emm0_df)
## Rounds emmean SE df asymp.LCL asymp.UCL
## 1 1.020447 0.03092121 Inf 0.9598429 1.081052
## 2 1.024721 0.03097255 Inf 0.9640155 1.085426
## 3 1.028994 0.03184303 Inf 0.9665826 1.091405
## 4 1.033267 0.03346879 Inf 0.9676693 1.098865
##
## Degrees-of-freedom method: asymptotic
## Confidence level used: 0.95
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 1.020447 1.024721 1.028994 1.033267
# Then, you can plot these points as before:
emm_plot <- ggplot(emm0_df, aes(x = Rounds, y = emmean)) +
geom_point() + # Add points for each estimated marginal mean
geom_line() + # Connect the points with a line to show trends
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) + # Add error bars for confidence intervals
labs(title = "Estimated Marginal Means of Reaction Time by Rounds",
x = "Rounds",
y = "Estimated Marginal Mean Reaction Time") +
theme_minimal() # Use a minimal theme for a clean look
# Print the plot
print(emm_plot)
# Trend analysis for numeric Game_Level
# Assuming trend_analysis is already obtained and contains the trend estimate
# Determine the range of Game_Level you want to visualize
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
# Retrieve the actual coefficient for Rounds from the model
coef_estimate_for_rounds <- coef(summary(model3))['Rounds', 'Estimate']
# Calculate predicted reaction times based on the actual model coefficient
predicted_reaction_times <- coef_estimate_for_rounds * rounds + coef(summary(model1))["(Intercept)", "Estimate"]
# Create a dataframe for plotting
trend_data <- data.frame(Rounds = rounds, Predicted_Reaction_Time = predicted_reaction_times)
# Plotting the trend
trend_plot <- ggplot(trend_data, aes(x = Rounds, y = Predicted_Reaction_Time)) +
geom_line(color = "blue") +
labs(title = "Trend of Reaction Time Across Rounds",
x = "Rounds",
y = "Predicted Reaction Time") +
theme_minimal()
# Print the plot
print(trend_plot)
##Cond.4 Accuracy
# Fit the model using glmer for a binary response
model3 <- glmer(Answer ~ 1 + Rounds + (1 | Player_ID), data = filtered_data, family = binomial)
# Print a summary of the model to examine fixed and random effects
print(summary(model3))
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Answer ~ 1 + Rounds + (1 | Player_ID)
## Data: filtered_data
##
## AIC BIC logLik deviance df.resid
## 11539.9 11561.4 -5767.0 11533.9 9435
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.9830 -1.3831 0.6185 0.6815 0.8532
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.06728 0.2594
## Number of obs: 9438, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.84912 0.06435 13.196 <2e-16 ***
## Rounds 0.03019 0.02912 1.037 0.3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Rounds -0.646
# Simulate residuals using DHARMa
simulationOutput <- simulateResiduals(fittedModel = model1, n = 250)
# Create diagnostic plots
plot(simulationOutput)
plotResiduals(simulationOutput)
plot(simulationOutput, type = "uniform")
plot(simulationOutput, type = "acf")
# Estimate marginal means at specific points along the Rounds
emm1 <- emmeans(model3, specs = ~ Rounds, at = list(Rounds = c(1, 2, 3, 4)), type = "response")
emm1_df <- as.data.frame(summary(emm1))
# Print the estimated marginal means separately
print(emm1_df)
## Rounds prob SE df asymp.LCL asymp.UCL
## 1 0.7066797 0.01050676 Inf 0.6856728 0.7268420
## 2 0.7128989 0.01062425 Inf 0.6916335 0.7332634
## 3 0.7190387 0.01357609 Inf 0.6916803 0.7448650
## 4 0.7250978 0.01786638 Inf 0.6887360 0.7587001
##
## Confidence level used: 0.95
## Intervals are back-transformed from the logit scale
# Extract and print just the mean values
mean_values <- emm1_df$emmean
print(mean_values)
## NULL
# Plot these points
emm_plot1 <- ggplot(emm1_df, aes(x = Rounds, y = prob)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) +
labs(title = "Estimated Marginal Probabilities of Answer = 1 by Rounds",
x = "Rounds",
y = "Probability of Answer = 1") +
theme_minimal()
print(emm_plot1)
# Trend analysis for Rounds
trend_analysis1 <- emtrends(model1, specs = ~ Rounds, var = "Rounds")
# Calculate and plot predicted probabilities across Rounds
rounds <- seq(min(filtered_data$Rounds), max(filtered_data$Rounds), by = 1)
predicted_probs <- predict(model1, newdata = data.frame(Rounds = rounds), type = "response", re.form = NA)
trend_data1 <- data.frame(Rounds = rounds, Predicted_Probability = predicted_probs)
trend_plot1 <- ggplot(trend_data1, aes(x = Rounds, y = Predicted_Probability)) +
geom_line(color = "blue") +
labs(title = "Trend of Probability of Answer = 1 Across Rounds",
x = "Rounds",
y = "Predicted Probability") +
theme_minimal()
print(trend_plot1)
# Fit the model with Game_Level as a numeric predictor
model4 <- lmer(Reaction_Time ~ 1 + Game_Level + (1 | Player_ID), data = data)
# Print a summary of the model to examine fixed and random effects
print(summary(model4))
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Reaction_Time ~ 1 + Game_Level + (1 | Player_ID)
## Data: data
##
## REML criterion at convergence: 22205.6
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.4816 -0.7244 -0.1009 0.6079 3.6745
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.01357 0.1165
## Residual 0.16333 0.4041
## Number of obs: 21488, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 8.831e-01 1.978e-02 4.255e+01 44.643 <2e-16 ***
## Game_Level -1.122e-02 1.255e-03 2.148e+04 -8.943 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Game_Level -0.258
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model4)
# Additional model diagnostics from the 'performance' package
check_model(model4)
# Estimate marginal means at specific points along the Game_Level
emm0 <- emmeans(model4, specs = ~ Game_Level, at = list(Game_Level = c(1, 2, 3, 4, 5, 6, 7, 8))) #####
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'pbkrtest.limit = 21488' (or larger)
## [or, globally, 'set emm_options(pbkrtest.limit = 21488)' or larger];
## but be warned that this may result in large computation time and memory use.
## Note: D.f. calculations have been disabled because the number of observations exceeds 3000.
## To enable adjustments, add the argument 'lmerTest.limit = 21488' (or larger)
## [or, globally, 'set emm_options(lmerTest.limit = 21488)' or larger];
## but be warned that this may result in large computation time and memory use.
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Print the estimated marginal means separately
print(emm0_df)
## Game_Level emmean SE df asymp.LCL asymp.UCL
## 1 0.8718624 0.01949501 Inf 0.8336529 0.9100719
## 2 0.8606385 0.01928664 Inf 0.8228374 0.8984396
## 3 0.8494146 0.01915838 Inf 0.8118648 0.8869643
## 4 0.8381906 0.01911185 Inf 0.8007321 0.8756492
## 5 0.8269667 0.01914764 Inf 0.7894380 0.8644954
## 6 0.8157427 0.01926528 Inf 0.7779835 0.8535020
## 7 0.8045188 0.01946331 Inf 0.7663714 0.8426662
## 8 0.7932949 0.01973929 Inf 0.7546066 0.8319832
##
## Degrees-of-freedom method: asymptotic
## Confidence level used: 0.95
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 0.8718624 0.8606385 0.8494146 0.8381906 0.8269667 0.8157427 0.8045188
## [8] 0.7932949
# Then, you can plot these points
emm_plot <- ggplot(emm0_df, aes(x = Game_Level, y = emmean)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0.1) +
labs(title = "Estimated Marginal Means of Reaction Time by Game_Level",
x = "Game_Level",
y = "Estimated Marginal Mean Reaction Time") +
theme_minimal()
print(emm_plot)
# Trend analysis for numeric Game_Level
game_levels <- seq(min(data$Game_Level), max(data$Game_Level), by = 1)
# Retrieve the actual coefficient for Game_Level from the model
coef_estimate_for_gls <- coef(summary(model4))['Game_Level', 'Estimate']
# Calculate predicted reaction times based on the actual model coefficient
predicted_reaction_times <- coef_estimate_for_gls * game_levels + coef(summary(model0))["(Intercept)", "Estimate"]
# Create a dataframe for plotting
trend_data <- data.frame(Game_Level = game_levels, Predicted_Reaction_Time = predicted_reaction_times)
# Plotting the trend
trend_plot <- ggplot(trend_data, aes(x = Game_Level, y = Predicted_Reaction_Time)) +
geom_line(color = "blue") +
labs(title = "Trend of Reaction Time Across Game_Level",
x = "Game_Level",
y = "Predicted Reaction Time") +
theme_minimal()
print(trend_plot)
# Fit the model using glmer for a binary response
model5 <- glmer(Answer ~ 1 + Game_Level + (1 | Player_ID), data = data, family = binomial)
# Print a summary of the model to examine fixed and random effects
print(summary(model5))
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Answer ~ 1 + Game_Level + (1 | Player_ID)
## Data: data
##
## AIC BIC logLik deviance df.resid
## 19237.2 19261.2 -9615.6 19231.2 21485
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -4.2094 0.3169 0.4090 0.4922 0.6890
##
## Random effects:
## Groups Name Variance Std.Dev.
## Player_ID (Intercept) 0.1247 0.3531
## Number of obs: 21488, groups: Player_ID, 38
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.23856 0.06889 17.98 <2e-16 ***
## Game_Level 0.11857 0.00874 13.57 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Game_Level -0.468
# Diagnostic plots for residuals - Adjusted for typical visualization tools in R
plot(model5)
# Additional model diagnostics from the 'performance' package
check_model(model5)
# Estimate marginal means at specific points along the Game_Level
emm0 <- emmeans(model5, specs = ~ Game_Level, at = list(Game_Level = c(1, 2, 3, 4, 5, 6, 7, 8))) #####
# Convert the summary to a data frame
emm0_df <- as.data.frame(summary(emm0))
# Convert the log odds (emmean) to probabilities
emm0_df$probability <- 1 / (1 + exp(-emm0_df$emmean))
# Print the estimated marginal means separately
print(emm0_df$probability)
## [1] 0.7952932 0.8139229 0.8312169 0.8472054 0.8619309 0.8754459 0.8878101
## [8] 0.8990885
# Extract and print just the mean values
mean_values <- emm0_df$emmean
print(mean_values)
## [1] 1.357132 1.475704 1.594277 1.712849 1.831421 1.949993 2.068565 2.187137
# Then, you can plot these probabilities
emm_plot <- ggplot(emm0_df, aes(x = Game_Level, y = probability)) +
geom_point() +
geom_line() +
geom_errorbar(aes(ymin = 1 / (1 + exp(-asymp.LCL)), ymax = 1 / (1 + exp(-asymp.UCL))), width = 0.1) +
labs(title = "Predicted Probability of Correct Answer by Game_Level",
x = "Game_Level",
y = "Probability of Correct Answer") +
theme_minimal()
print(emm_plot)
# Trend analysis for numeric Game_Level
game_levels <- seq(min(data$Game_Level), max(data$Game_Level), by = 1)
# Retrieve the actual coefficient for Game_Level from the model
coef_estimate_for_gls <- coef(summary(model5))['Game_Level', 'Estimate']
# Calculate predicted log odds based on the actual model coefficient
predicted_log_odds <- coef_estimate_for_gls * game_levels + coef(summary(model5))["(Intercept)", "Estimate"]
# Convert predicted log odds to probabilities
predicted_probabilities <- 1 / (1 + exp(-predicted_log_odds))
# Create a dataframe for plotting
trend_data <- data.frame(Game_Level = game_levels, Predicted_Probability = predicted_probabilities)
# Plotting the trend of probabilities
trend_plot <- ggplot(trend_data, aes(x = Game_Level, y = Predicted_Probability)) +
geom_line(color = "blue") +
labs(title = "Trend of Predicted Probability Across Game_Level",
x = "Game_Level",
y = "Predicted Probability") +
theme_minimal()
print(trend_plot)